import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;

/**
 * 详细分析ep解密后的结构
 */
public class AnalyzeEPStructure {
    
    private static final String EP_BASE64 = "qt0AJsNLEfayUx7S15jLfmQvMOpW6JJ+jCoxeXxn676R2OiN6xpLIQWSYe8ETFUF4+AaGrVY1wMCdyUPVaHM0J+8m+q/PUFgbiP3N8xSKQc4lIzzZuckbybYiFuLbEhcblmy162S5B70UJxzB6grhIVpsG/h0uw+JPaS2yTPpPVCiN/SImdOw2g12cun6niAwRZSQktZikzzbjwkRoiO8ehrwlAFJircnT1/1zba2oaGXLc/yU6cM2vWgJdyyoXJF4Mo/5XNBTDT+8yr1hPC5MKHWcTBB/isrRTD5CczInLgXHl48KKz18GkpPM7MML1GHb4pIjfTvu8hv/SLLW0sg==";
    
    private static final String PRIVATE_KEY_PEM = 
        "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCz8JyumzBRR1nj" +
        "dxPzCFpqWXrAUBiC4ycTbTDdWdpZkciwiXU5s/OxF5i7l+Hvwc9Ggjph/PKo7PpW" +
        "hxZpzyEGpd6yVN9jAjJOt23o2TesgK8L/DAMhdJL8gNxKAQumbGF+ebMbcS8jWLx" +
        "vDAqpmnEW8VdCLEjF6uqOPtcDmIkBF83W6oaeu32DzTr/NS16sUGQKxlflo9qPOl" +
        "7VtcIsbR52klKK4uIyY23tWCouiyG84c/Uit+PleD5EYUGEu3p7IAAG5uJNzeUd0" +
        "UjZDhy6x7ue+kGgcCmCNQ4zSS/bQHMknalwqJUvUSxtIf8dq+/D78m7d4Zt9n9ZD" +
        "27t4Z2jHAgMBAAECggEAAr15RVdrpvE1NzeLADpyVghCzEbr+KJI6AzTn6tMneyQ" +
        "Z8/QDy7kWSAI3WJ0uFf1Nhepl/BoKZZiQYsRFk9nK1i/SWvtcu6HoZc9fzw/ksrq" +
        "333ZpXcsOqfW0ZRQa/0/LNEfaKGLS2vDw/afrSaXmbvkB4SoXeZwYMk5Wq+FYxL/" +
        "alrNpg/lzdvBlsCsTDA0G2RZrUVaO5yRTLRisBU+i8yORgnGkEwWvKpZYSFogCHS" +
        "iYHiNXFy//C+sYWlK7DjmG8/+krKhqBRRfdeg7LFThHQpbEGTtueD57jw0PCo2yr" +
        "6dqTvW9Qys+aWVNJk7RHNaI0yBFKWPadaHi3/olzkQKBgQDmz/FDpztS0fjKDIOj" +
        "gDyE76Z6dRFenmKJM1eOFt+MniY6/vi4ylU51/Etm4k6dNJ1MVBoFfyT9X0U/4k7" +
        "GNNUfIxMCJztUgY6EaCCt+09wk8pIvmOlRCmtxGwvmVC4nJVgUj3XJQ+wseblAkk" +
        "W0+IuT3GKX0CdKFMU4q9aucLYwKBgQDHk3rQ8Ae4ci4oj+MehRI29SNpcXG6OHbr" +
        "Z2EdsgqiFC1o/qv0269jtmCP7IqkGMdhTQrVetTHjZNZJH2bvUZ4o/0YT2+TTFPI" +
        "kTb2/a0txUTBTKrbnAdXh/iPFZAGvBROEDN0MNKo/vGAfi0K836DeTyBIaYongm6" +
        "6Rn6pwnUTQKBgBveVaougfoxAhIbSrWuISCH8xjsE6nSA+G/Aj5Uwq8u1TzgVlWx" +
        "kHLIgQVZt0sImfSufJ/kr7eJt42WgRJSoAmedC4mCBSbh8bxI+lEne+MC5TS9UDi" +
        "/Ly0c/1cL8vQna93ScEcO4YMbJ97U1NBdyvx+eR4U/C89lDJ8YGHa9gzAoGAQ6sY" +
        "sHFCXOKyDeTDoFyEUYgKqrzhT7/HaofR4Oy2OEBZKUl4anx2WnvC/+m3FG6mY7Jo" +
        "ovuT29mABXCe+khR9aO8tBpy/WGa4t2B4nse1e8WIehp4i5kOuSKfZFVFUN+Kv3J" +
        "RHMtakmO/v9JLHZlBhT8U9hh61GygOJ6gYdTiN0CgYAFz9iPy/xqLOUwiTNp3Imz" +
        "hdZo9ol3Qlr9CfMWMFHqRA5AyYvly9ZzxTpUCpSA+qz6OXqAjJ0bhGQxW2KHpmcT" +
        "yNGOPPca2vCaW8Mb1NTQueXpUBqX7alIkrRjUUyULteLb8FtyYl7mR3TVIu3FoO5" +
        "anNwDZ+2y7R9WUEiOzY3NA==";
    
    public static void main(String[] args) {
        try {
            System.out.println("=" + "=".repeat(99));
            System.out.println("详细分析ep解密后的结构");
            System.out.println("=" + "=".repeat(99));
            
            // 解密ep
            byte[] epEncrypted = Base64.getDecoder().decode(EP_BASE64);
            byte[] privateKeyBytes = Base64.getDecoder().decode(PRIVATE_KEY_PEM);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            
            Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding");
            rsaCipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] epDecrypted = rsaCipher.doFinal(epEncrypted);
            
            System.out.println("\nep解密后的完整256字节:");
            printHexDump(epDecrypted);
            
            System.out.println("\n" + "=".repeat(100));
            System.out.println("结构分析:");
            System.out.println("=".repeat(100));
            
            // 分析各个段
            System.out.println("\n[字节 0]: " + String.format("0x%02x", epDecrypted[0]));
            
            System.out.println("\n[字节 1-32] (32字节):");
            printHexBlock(epDecrypted, 1, 33);
            
            System.out.println("\n[字节 33-64] (32字节):");
            printHexBlock(epDecrypted, 33, 65);
            
            System.out.println("\n[字节 65-96] (32字节):");
            printHexBlock(epDecrypted, 65, 97);
            
            System.out.println("\n[字节 97-128] (32字节):");
            printHexBlock(epDecrypted, 97, 129);
            
            System.out.println("\n[字节 129-160] (32字节):");
            printHexBlock(epDecrypted, 129, 161);
            
            System.out.println("\n[字节 161-192] (32字节):");
            printHexBlock(epDecrypted, 161, 193);
            
            System.out.println("\n[字节 193-224] (32字节):");
            printHexBlock(epDecrypted, 193, 225);
            
            System.out.println("\n[字节 225-256] (32字节):");
            printHexBlock(epDecrypted, 225, 256);
            
            // 检查重复模式
            System.out.println("\n" + "=".repeat(100));
            System.out.println("模式分析:");
            System.out.println("=".repeat(100));
            
            // 检查是否有重复的32字节块
            for (int i = 0; i < 256; i += 32) {
                byte[] block1 = Arrays.copyOfRange(epDecrypted, i, Math.min(i + 32, 256));
                for (int j = i + 32; j < 256; j += 32) {
                    byte[] block2 = Arrays.copyOfRange(epDecrypted, j, Math.min(j + 32, 256));
                    if (Arrays.equals(block1, block2)) {
                        System.out.println("发现重复块: [" + i + "-" + (i+32) + "] == [" + j + "-" + (j+32) + "]");
                    }
                }
            }
            
            // 检查零字节
            int zeroCount = 0;
            for (byte b : epDecrypted) {
                if (b == 0) zeroCount++;
            }
            System.out.println("\n零字节数量: " + zeroCount + " / 256");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static void printHexDump(byte[] data) {
        for (int i = 0; i < data.length; i += 16) {
            System.out.printf("%04x: ", i);
            for (int j = i; j < Math.min(i + 16, data.length); j++) {
                System.out.printf("%02x ", data[j]);
            }
            // 填充空格
            for (int j = data.length; j < i + 16; j++) {
                System.out.print("   ");
            }
            System.out.print(" | ");
            // 打印ASCII
            for (int j = i; j < Math.min(i + 16, data.length); j++) {
                char c = (char) data[j];
                System.out.print((c >= 32 && c < 127) ? c : '.');
            }
            System.out.println();
        }
    }
    
    private static void printHexBlock(byte[] data, int start, int end) {
        StringBuilder sb = new StringBuilder();
        for (int i = start; i < Math.min(end, data.length); i++) {
            sb.append(String.format("%02x", data[i]));
        }
        System.out.println(sb.toString());
    }
}


